package com.tsmti.core.common.dao;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Title：PimsSystem
 * Class：com.tsmti.core.base
 * Comapny:
 *
 * @author：zcw
 * @version：2.5 CreateTime：2017/12/29 15:56
 * Modify log:
 * Description：
 */
public interface BaseDao {

    /**
     * 保存
     * @param entity 实体类
     * @param <T> 泛型
     * @return  保存
     */
    <T> T save(T entity);

    /**
     * 批量保存
     * @param entitys 实体类集合
     * @param <T> 泛型
     */
    <T> void saveAll(List<T> entitys);

    /**
     * 批量保存返回列表
     * @param entitys  实体类集合
     * @return 批量保存返回列表
     */
    <T> List<T> saveList(List<T> entitys);

    /**
     * 新增或更新
     * @param entity 实体类集合
     * @param <T> 泛型
     */
    <T> void saveOrUpdate(T entity);

    /**
     * 更新
     * @param entity 实体类
     * @param <T> 泛型
     */
    <T> void update(T entity);
//
//    <T> T merge(T entity);

    /**
     * load
     * @param id 主键
     * @param entityClass 实体类型
     * @param <T> 泛型
     * @return 对象
     */
    <T> T load(Serializable id, Class<T> entityClass);

    /**
     * get
     * @param id 主键
     * @param entityClass 实体类
     * @param <T> 泛型
     * @return 对象
     */
    <T> T get(Serializable id, Class<T> entityClass);

    /**
     * get
     * @param propertyName 属性
     * @param value 值
     * @param entityClass 实体类型
     * @param <T> 泛型
     * @return 对象
     */
    <T> T get(String propertyName, Object value, Class<T> entityClass);

    /**
     * 实体是否存在
     * @param id 主键
     * @param entityClass 实体类型
     * @param <T> 泛型
     * @return  实体是否存在
     */
    <T> Boolean exists(Serializable id, Class<T> entityClass);

    /**
     * 数量
     * @param entityClass 实体类型
     * @param <T> 泛型
     * @return 数量
     */
    <T> Long count(Class<T> entityClass);

    /**
     *数量
     * @param detachedCriteria 参数
     * @param <T> 泛型
     * @return 数量
     */
    <T> Long count(DetachedCriteria detachedCriteria);

    /**
     *数量
     * @param entityClass 实体类型
     * @param criterions 参数
     * @param <T> 泛型
     * @return 数量
     */
    <T> Long count(Class<T> entityClass, Criterion... criterions);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param propertyName 属性
     * @param value 值
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> list(Class<T> entityClass,String propertyName, Object value);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param orderType 排序方式
     * @param orderName 培训列
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByOrder(Class<T> entityClass, String orderType,String orderName);

    /**
     *集合
     * @param entityClass 实体类型
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> list(Class<T> entityClass);

    /**
     *集合
     * @param detachedCriteria 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> list(DetachedCriteria detachedCriteria);

    /**
     * 集合
     * @param page 页码
     * @param rows 行数
     * @param detachedCriteria 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> list(int page, int rows, DetachedCriteria detachedCriteria);

    /**
     *集合
     * @param entityClass 实体类型
     * @param criterions 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByCriterion(Class<T> entityClass, Criterion... criterions);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param orderType 排序方式
     * @param orderName 排序列
     * @param criterions 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByCriterion(Class<T> entityClass, String orderType,String orderName, Criterion... criterions);

    /**
     *集合
     * @param entityClass 实体类
     * @param page 页码
     * @param rows 行数
     * @param criterions 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByCriterion(Class<T> entityClass, int page, int rows, Criterion... criterions);

    /**
     *集合
     * @param entityClass 实体类型
     * @param page 页码
     * @param rows 行数
     * @param orderType 排序方式
     * @param orderName 排序列
     * @param criterions 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByCriterion(Class<T> entityClass, int page, int rows,String orderType,String orderName,
                                Criterion... criterions);

    /**
     *集合
     * @param entityClass 实体类型
     * @param page 页码
     * @param rows 行数
     * @param sql sql
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listPageBySql(Class<T> entityClass,int page, int rows,String sql, Object... params);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param sql sql
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listBySql(Class<T> entityClass,String sql,  Object... params);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param sql sql
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listByAliasSql(Class<T> entityClass,String sql,Map<String,Object> params);

    /**
     * 集合
     * @param entityClass 实体类型
     * @param page 页码
     * @param rows 行数
     * @param sql sql
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> listPageByAliasSql(Class<T> entityClass,int page, int rows,String sql,Map<String,Object> params);

    /**
     * 移除
     * @param entity 实体类
     * @param <T> 泛型
     */
    <T> void remove(T entity);

    /**
     * 根据主键移除
     * @param id 主键
     * @param entityClass 实体类型
     * @param <T> 泛型
     */
    <T> void removeById(Serializable id, Class<T> entityClass);

    /**
     * 批量移除
     * @param entitys 实体类list
     * @param <T> 泛型
     */
    <T> void removeAll(List<T> entitys);

    /**
     * 移除
     * @param propertyName 参数
     * @param value 值
     * @param entityClass 实体类
     * @param <T> 泛型
     */
    <T> void removeAllByProperty(String propertyName, Object value, Class<T> entityClass);

    /**
     * 更新
     * @param hql sql
     * @param params 参数
     * @return 更新
     */
    Integer updateByHql(final String hql, final Object... params);

    /**
     * 更新
     * @param hql sql
     * @param alias 集合
     * @return 更新
     */
    Integer updateByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * 更新
     * @param sql sql
     * @param params 参数
     * @return 更新
     */
    Integer updateBySql(final String sql, final Object... params);

    /**
     * 更新
     * @param sql sql
     * @param alias 集合
     * @return 更新
     */
    Integer updateByAliasSql(final String sql, final Map<String, Object> alias);

    /**
     * 数量
     * @param hql sql
     * @param params 参数
     * @return 数量
     */
    Long countByHql(final String hql, final Object... params);

    /**
     * 数量
     * @param hql sql
     * @param alias 参数集合
     * @return 数量
     */
    Long countByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * 数量
     * @param sql sql
     * @param params 参数
     * @return 数量
     */
    Long countBySql(String sql,  Object... params);

    /**
     * 数量
     * @param sql sql
     * @param alias 集合
     * @return 数量
     */
    Long countByAliasSql(final String sql, final Map<String, Object> alias);

    /**
     * 集合
     * @param entityClass 实体类
     * @param hql sql
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> findByHql(Class<T> entityClass,final String hql, final Object... params);

    /**
     * 集合
     * @param hql sql
     * @param alias 集合
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> findByAliasHql(final String hql, final Map<String, Object> alias);

    /**
     * 集合
     * @param hql sql
     * @param page 页码
     * @param rows 行数
     * @param params 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> findByHql(final String hql, int page, int rows, final Object... params);

    /**
     * 集合
     * @param hql sql
     * @param page 页码
     * @param rows 行数
     * @param alias 参数
     * @param <T> 泛型
     * @return 集合
     */
    <T> List<T> findByAliasHql(final String hql, int page, int rows, final Map<String, Object> alias);

    /**
     * 获取map集合列表
     * @param hql sql
     * @param params 参数
     * @return 获取map集合列表
     */
    List<Map<String, Object>> findMapByHql(final String hql, final Object... params);

    /**
     *获取map集合列表
     * @param hql sql
     * @param alias map
     * @return 获取map集合列表
     */
    List<Map<String, Object>> findMapByAliasHql(final String hql, final Map<String, Object> alias);

}
